﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MIP_Projekt2011_bjarke
{
    public class Library : ICollection<Book>
    {
        // Variabel til smide integers i under Afleveringsmetoden
        private int bøde;

        #region Default properties og metoder
        // Liste til at opbevare bog objekter af klassen Book i.
        private List<Book> _books = new List<Book>();

        public List<Book> Books()
        {
            return _books;
        }

        public void Add(Book item)
        {
            _books.Add(item);
        }
        
        public void Clear()
        {
            _books.Clear();
        }

        public bool Contains(Book item)
        {
            return _books.Contains(item);
        }

        public void CopyTo(Book[] array, int arrayIndex)
        {
            _books.CopyTo(array, arrayIndex);
        }
        
        public int Count
        {
        get { return _books.Count; }
        }

        public bool IsReadOnly
        {
            get { return false; }
        }

        public bool Remove(Book item)
        {
            return _books.Remove(item);
        }

        public IEnumerator<Book> GetEnumerator()
        {
            foreach (Book b in _books)
                yield return b;
        }

        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return this.GetEnumerator();
        }
        #endregion

        #region Metode til at låne bøger
        // Metode som tilføjer element til en ny lånerliste
        public List<Book> TilføjBogLån(List<Book> LåneListe)
        {
            Console.WriteLine("Indtast ID på bogen du vil låne: \n");
            int boglån = int.Parse(Console.ReadLine()); //Tager brugers input og gemmer den i en int kaldet "boglån".

            //Her oprettes en query hvor listen søges igennem for IDer der er indeholdt i Book klassens bogID 
            //og hvor bogen ikke er udlånt.
            var bogLånsResultater = from p in this._books
                                    where p.bogID.ToString().Contains(boglån.ToString()) && p.ErUdlånt == false
                                    select p;

            // Denne er lavet for at kunne give en fejlmelding i tilfælde af at brugeren selecter en bog som er udlånt.
            var bogLånsFejl = from b in this._books
                                    where b.bogID.ToString().Contains(boglån.ToString()) && b.ErUdlånt == true
                                    select b;

            foreach (var p in bogLånsResultater)
            {
                LåneListe.Add(p);
                //Console.WriteLine(p.ToString()); //ToString() metoden kaldes på var p.
            }

            foreach (var b in bogLånsFejl)
            {
                Console.WriteLine("Beklager men den valgte bog er på nuværende tidspunkt udlånt.");
            }

            return LåneListe;
        }
        #endregion

        #region Udlånsmetode
        // Denne metode kaldes andet steds og suppleres ved kaldet med listen af bøger der skal lånes.
        public List<Book> Udlån(List<Book> books)
        {
            foreach (Book b in books)
            {
                // Sætter bøger til udlånt
                b.ErUdlånt = true;

                // Sætter bøgers udlånsdato til den aktuelle dato
                b.Udlånsdato = DateTime.Today;
            }
            return books;
        }
        #endregion

        #region Søgefunktioner

        #region Søgning efter ikke Udlånte bøger
        public List<Book> IkkeUdlåntSøgning()
        {
            List<Book> ikkeUdlånteBøger = new List<Book>();

            Console.WriteLine("Her er listen over alle bøger som er på lager: \n");

            //Opretter her en query hvor vi søger listen af bøger igennem for ikke udlånte bøger 
            var UdlånteBogSøgningsResultater = from p in this._books
                                          where p.ErUdlånt == false
                                          select p;

            foreach (var p in UdlånteBogSøgningsResultater)
            {
                ikkeUdlånteBøger.Add(p);
            }
            return ikkeUdlånteBøger;
        }
        #endregion

        #region Søgning efter titel
        public List<Book> Titelsøgning()
        {
            List<Book> titelBøger = new List<Book>();

            Console.WriteLine("Indtast en del af titlen på den bog du vil søge efter: \n");
            string titelSøgning = Console.ReadLine(); //Tager brugers input og gemmer den i en string kaldet "titelSøgning".

            //Opretter her en query hvor vi søger listen igennem for bøger der indeholde strengen titelSøgning.
            var titelSøgningsResultater = from p in this._books
                                          where p.Titel.Contains(titelSøgning)
                                          select p;

            foreach (var p in titelSøgningsResultater)
            {
                titelBøger.Add(p);
            }

            if (titelBøger.Count == 0)
            {
                Console.WriteLine("Fejl: Beklager men der blev ikke fundet nogle resultater på din søgning");
            }

            return titelBøger;
        }
#endregion

        #region Søgning efter forfatter
        public List<Book> Forfattersøgning()
        {
            List<Book> forFatterBøger = new List<Book>();

            Console.WriteLine("Indtast navnet på forfatteren du vil søge efter bøger fra: \n");
            //Tager brugers input og gemmer den i en string kaldet "navneSøgning".
            string forfatterSøgning = Console.ReadLine(); 

            //Opretter her en query hvor vi søger listen igennem for bøger hvis forfatter indeholder input.  
            var forfatterSøgningsResultater = from p in this._books
                                          where p.Forfatter.Contains(forfatterSøgning)
                                          select p;

            foreach (var p in forfatterSøgningsResultater)
            {
                forFatterBøger.Add(p);
            }

            if (forFatterBøger.Count == 0)
            {
                Console.WriteLine("Fejl: Beklager men der blev ikke fundet nogle resultater på din søgning");
            }
            return forFatterBøger;
        }
        #endregion

        #endregion

        #region Afleveringsmetode
        // Jeg kalder denne metode andet steds og suplerer den ved kaldet med listen af bøger der skal afleveres.
        public int Aflevering(List<Book> books)
        {
            // Variabel til at gemme den samlede bøde i.
            int samletBøde = 0;

            foreach (Book b in books)
            {
                /**
                 * Jeg lader være at benytte b.Afleveringsdato = DateTime.Today; alene fordi at jeg i det her tilfælde har hardcoded
                 * book objekter ind og når vi nu når til den mundtlige eksamen ville resultateterne være anderledes end de er på
                 * nuværende tidspunkt da .Today tager dagens dato. 
                 */
                b.Afleveringsdato = DateTime.Today;

                #region Del til at finde tidsforskellen
                // Erklæring af nye DateTime variabler, dette er ikke en nødvendighed.
                DateTime StartDate = b.Udlånsdato;
                DateTime EndDate = b.Afleveringsdato;

                // Finder tidsforskellen mellem Udlånsdatoen og Afleveringsdatoen
                TimeSpan TimeDifference = EndDate - StartDate;
                #endregion

                #region Bøde tjekkene
                    if(TimeDifference.Days > 28)
                    {
                        int numberOfDaysOverdue = TimeDifference.Days - 28;
                        bøde = numberOfDaysOverdue * 2;

                        if (bøde >= 40)
                        {
                            bøde = 40;
                        }
                    }
                    else
                    {
                        bøde = 0;
                    }

                // Den samlede bøde opsummeres.
                samletBøde += bøde;

                // Bøgers status sætter til at være hjemme igen.
                b.ErUdlånt = false;

                // Fremtidig metode til at fjerne bogobjektet fra listen books.
                // books.Remove(b);
                #endregion
            }
            return samletBøde;
        }
        #endregion

    }
}
